<?php
class PrimerturnoController extends AppController {

	var $name = 'Primerturno';
	var $components = array('Email'); //  use component email 
	var $uses = array('Client','RolsUsers','User','Sexe','ClientsProduct','Product','Person','SpecialtiesUser','Agenda','Segment','AgendasSegment','Turn','Stateturn','InsurancesPerson','Insurance');
    var $helpers = array('Turnos');

    function beforeFilter () {
        parent::beforeFilter();

		// Aplico el Layout segun la Vista o si es AJAX
		if ($this->RequestHandler->isAjax()) {
			$this->layout = 'ajax';
		}else{
			// Cambio la Vista por la del Rol
			$this->layout = strtolower($this->Session->read('VistaActual'));
		}
    }

	function index() {
	
		// $this->_accede('carga_turnos');
		$cliente_id = $this->Session->read('ClientesUsuarioLogueado.id');
		
        //-- Busco el Cliente
        $this->Client->recursive = 2;
        $this->Client->unbindModel(array('hasMany' => array('Evolution','Recomendation','PeoplePractice','PeopleProblem','PeopleRecomendation',
											'PeopleSign','PeopleVademecum','Person','Result','Turn','License','ClientsPerson',
											'ClientsSponsor','ClientsUser','Combo')	,
										 'belongsTo' => array('Stateclient','Country'),
									)	);            
										
        $Cliente = $this->Client->read(null,$cliente_id);


        // --- Forzado de busqueda de productos, porque no los traia siempre....
        $sql = "select products.id, products.name 
				from products 
				where products.id in (select distinct product_id from products_users where client_id='$cliente_id')";
        $Cliente['ClientsProduct'] = $this->Product->query($sql);

        if (empty($Cliente)){
            $this->Session->setFlash(__('Cliente Inexistente.', true));
            $this->redirect(array('action'=>'error'));
            die();            
        } elseif($Cliente['Client']['stateclient_id']!=1) {
            $this->Session->setFlash(__('Cliente Inactivo.', true));
            $this->redirect(array('action'=>'error'));
            die();            
        }

			
        /* Cuales son los usuarios con rol=4 -> Profesionales */
        $Usuarios        = array();
        $Medico['id']    = 0;
        $Medico['name']  = '';
        $Medico['email'] = '';
        $xListaMedicos = array();
        $SelectMedicos = array();
        $Secretarias = array();

        $Especialidades_Medicos = array();

        $Especialidades = array();
		$Especialidad_Medico = array();

        foreach( $Cliente['RolsUser'] as $r ){
                
                // Si el usuario es Profesional
                if ( $r['rol_id']==4 ){
                    
                    $profesional_id = $r['user_id'];
                    
                    // Antes de armar el select, compruebo que tenga agenda definida
					$this->Agenda->recursive = 1;
                    $options      = array('conditions' => array('Agenda.user_id' => $profesional_id));
                    $segmentos_agenda = $this->Agenda->find('first',$options);

                    if (!empty($segmentos_agenda['AgendasSegment'])) {
                
						$Usuarios[$profesional_id]['email']  = $r['User']['email'];
                        $Usuarios[$profesional_id]['nombre'] = $r['User']['lastname'].', '.$r['User']['name'];

                        /* Arma combo para select de medicos */
                        $SelectMedicos[$profesional_id] = $r['User']['lastname'].', '.$r['User']['name'];
                                

                        // Que Especialidades tiene ese médico?
                        $query = "select specialties.id, specialties.name from specialties 
                                         left join specialties_users on specialties_users.specialty_id = specialties.id 
                                         where specialties_users.user_id = '$profesional_id'";

                        $x = $this->SpecialtiesUser->query($query);

                        if ($x){
							foreach ($x as $z){
                                // este es para asignarle al medico las especialidades
                                //$Especialidades[$z['specialties']['name']][$profesional_id] = $r['User']['lastname'].', '.$r['User']['name'];
                                $Especialidades[$z['specialties']['id']] = $z['specialties']['name'];
								$Especialidades_Medicos[$z['specialties']['id']][$profesional_id] = $r['User']['lastname'].', '.$r['User']['name'];
                            }
                        }

                        
                    }
                } elseif($r['rol_id']==2){ // Si el usuario es Asistente
                    //Secretaria   
                    $secretaria_id = $r['user_id'];
                    
                    $Secretarias[$secretaria_id]['email']  = $r['User']['email']; 
                    $Secretarias[$secretaria_id]['nombre'] = $r['User']['lastname'].', '.$r['User']['name'];
                    
                }
        } // endforeach

        // Guardo los datos del cliente en la session
        $sessCliente['Cliente']['time']       = time();
        $sessCliente['Cliente']['cliente_id'] = $cliente_id;
        $sessCliente['Cliente']['name']       = $Cliente['Client']['name'];
        $sessCliente['Cliente']['email']      = $Cliente['Client']['email'];
        $sessCliente['Cliente']['direccion']  = $Cliente['Client']['direccion'];
        $sessCliente['Cliente']['provincia']  = $Cliente['Client']['provincia'];
        $sessCliente['Cliente']['localidad']  = $Cliente['Client']['localidad'];
        $sessCliente['Cliente']['telefono']   = $Cliente['Client']['telefono'];
        $sessCliente['Medico']                = $Medico; // este indica si el medico vino como parametro /solicitar/cliente_id/medico_id
        $sessCliente['Medicos']               = $Usuarios; // lista de medicos de ese cliente
        $sessCliente['Secretarias']           = $Secretarias; // lista de secretarias de ese cliente            
            
        $sessCliente['SelectMedicos']         = $SelectMedicos;
        $sessCliente['SelectEspecialidades']  = $Especialidades;
        $sessCliente['Especialidades_Medicos']= $Especialidades_Medicos;

		

        //-- Guardo Productos del Cliente
        $Productos = array();
            //pr($Cliente);
        foreach($Cliente['ClientsProduct'] as $p){
            $Productos[$p['products']['id']] = $p['products']['name'];
        }
        $sessCliente['Productos'] = $Productos;

          
        //--Busco tabla de sexos            
        $Sexo = $this->Sexe->find('list');
        $sessCliente['Sexo']                 = $Sexo;
                        
        $this->Session->write('sessCliente',$sessCliente);

        $this->set('sessCliente',$sessCliente);
		
		$id_especialidad = 0;
		$id_profesional = 0;
		
		
		if($_POST){
		
			if($this->data['Paciente']['seleccionar_por'] == 1) {
				$buscar_por = '1';
			} else {
				$buscar_por = '2';
			}
			
			if(isset($_POST['dia_a_consultar']) and !empty($_POST['dia_a_consultar']) ) { $dia_actual=$_POST['dia_a_consultar'];}
			
			if(isset($dia_actual)) {
				$ano = date("Y",$dia_actual);
				$mes = date("m",$dia_actual);
				$dia = date("d",$dia_actual);
				$dia_actual = mktime(0,0,0,$mes,$dia,$ano);
			} else {
				$dia_actual = time();
			}
			
			$hoy        = mktime(0,0,0,date("m",time()),date("d",time()),date("Y",time()));

			if ($buscar_por==1){
				// Busco turnos por profesional
				if ( !isset($this->data['Paciente']['medico_elegido']) ) { 
					$this->data['Paciente']['medico_elegido']=0; 
				}
				$id_profesional = $this->data['Paciente']['medico_elegido'];
				$id_especialidad = 0;

			} else {

				if( !isset($this->data['Paciente']['especialidad_elegida']) ) { 
					$this->data['Paciente']['especialidad_elegida']=0; 
				}
				$id_especialidad = $this->data['Paciente']['especialidad_elegida'];
				$id_profesional  = 0;
			}
			
			$sessCliente = $this->Session->read('sessCliente');
			
			$sessCliente['profesional_elegido']       = $id_profesional;
			$sessCliente['especialidad_elegida']       = $id_especialidad;
			
			$this->Session->write("sessCliente",$sessCliente);  
			$this->set('sessCliente',$sessCliente);	

			$DiaProcesado = $dia_actual;	
			while (true){
		
				$HayTurno = $this->semanal($DiaProcesado, $id_profesional, $id_especialidad);            
				if ($HayTurno=='avanza'){
					$DiaProcesado = $DiaProcesado + 604800;					
				} else {
					break;
				}
			}
			//$this->semanal($ano, $mes, $dia);            		
		
		} else {
			$buscar_por = '1';
			$id_profesional = 0;
			$HayTurno = '';
			$DiaProcesado = time();
		}
		$SemanaSiguiente = $DiaProcesado + 604800;	
		$SemanaAnterior = $DiaProcesado - 604800;
		$this->set('buscar_por',$buscar_por);
		$this->set('SemanaSiguiente',$SemanaSiguiente);
		$this->set('SemanaAnterior',$SemanaAnterior);
		$this->set('Agenda',$HayTurno);
		$this->set('id_profesional',$id_profesional);
		$this->set('id_especialidad',$id_especialidad);
		
		
    }    

 
    
	function semanal($DiaProcesado=0,$id_profesional=0,$id_especialidad=0) {
		
		$sessCliente = $this->Session->read('sessCliente');
//		pr($sessCliente);
		if($DiaProcesado==0){ $DiaProcesado = time(); }
		$anio = date("Y", $DiaProcesado );
		$mes  = date("m", $DiaProcesado ); 
		$dia  = date("d", $DiaProcesado ); 

//echo "<hr>$dia-$mes-$anio<hr>";		

		$DiaActual = mktime(0,0,0,$mes,$dia,$anio);
		$sessCliente['fechas']['DiaActual'] = $DiaActual;
		$this->Session->write("sessCliente",$sessCliente);  
	
		$id_profesional   = $sessCliente['profesional_elegido'] ;
		$cliente_id       = $sessCliente['Cliente']['cliente_id'] ;

		$this->data['Paciente'] = $this->Session->read('DataPaciente');
		
		$data = null;

		/* ----------------------------------------------------------------------------- */
		/* Consulto la Configuracion de la Agenda para la Fecha Seleccionada			 */
		/* ----------------------------------------------------------------------------- */
		if($id_profesional>0) {
			$config_agenda = $this->Agenda->query("
					SELECT 
						Segment.*, Agenda.user_id as medico_id
					FROM
						agendas AS Agenda 
						INNER JOIN agendas_segments AS AgendasSegment ON AgendasSegment.agenda_id = Agenda.id
						INNER JOIN segments AS Segment ON Segment.id = AgendasSegment.segment_id
					WHERE 
						Agenda.client_id = '$cliente_id' AND Agenda.user_id = '$id_profesional'
					ORDER BY 
						Segment.day_id, Segment.horario_desde
				"
			);
		} else {
			$Especialidades_Medicos = $sessCliente['Especialidades_Medicos'];
			//pr($Especialidades_Medicos);
			$lista_medicos = '';
			foreach( $Especialidades_Medicos[$id_especialidad] as $clave=>$valor ) {
				$lista_medicos.= $clave.',';
			}
			$lista_medicos = substr($lista_medicos,0,-1);
						
			$config_agenda = $this->Agenda->query("
					SELECT 
						Segment.*, Agenda.user_id as medico_id
					FROM
						agendas AS Agenda 
						INNER JOIN agendas_segments AS AgendasSegment ON AgendasSegment.agenda_id = Agenda.id
						INNER JOIN segments AS Segment ON Segment.id = AgendasSegment.segment_id
					WHERE 
						Agenda.client_id = '$cliente_id' AND Agenda.user_id IN ($lista_medicos)
					ORDER BY 
						Segment.day_id, Segment.horario_desde
				"
			);
		}
//pr($config_agenda);
		if(!$config_agenda) { return 'sin_agenda'; die();}
		
		//--------------------------------------------------------------------------------
		// Obtengo el rango de fecha para consultar los turnos (inicio y fin de la semana)
		// De esta manera traigo en la consulta, solo la semana actual, antes traia -7 +7
		//--------------------------------------------------------------------------------
		$dias_menos     = date("w",$DiaActual)-1; //Cantidad de dias a restar para calcular el comienzo de semana
		$dias_mas       = 6-$dias_menos; // Cantidad de dias a sumar para calcular el fin de la semana
		$consulta_desde = date("Y-m-d",mktime(0,0,0,$mes,$dia-$dias_menos,$anio)); // Primer dia de la semana
		$consulta_hasta = date("Y-m-d",mktime(23,59,59,$mes,$dia+$dias_mas,$anio)); // Ultimo dia de la semana

		$dia_inicio = date("d",mktime(0,0,0,$mes,$dia-$dias_menos,$anio));
		$mes_inicio = date("m",mktime(0,0,0,$mes,$dia-$dias_menos,$anio));
		$ano_inicio = date("Y",mktime(0,0,0,$mes,$dia-$dias_menos,$anio));
				
		
		//-----------------------------------------------------------------------------------
		//- Armo un array con clave nro.de.dia de la semana para poder contar la cantidad 
		//  de turnos dados ese dia y saber si puedo dar mas segun si acepta o no sobreturnos
		//------------------------------------------------------------------------------------
		$AgendaSemanal = array();
		
		if($config_agenda){
			foreach($config_agenda as $ca){
				$dia_de_la_semana = $ca['Segment']['day_id'];

				
				// Cuantos Turnos puede atender ese dia?
				$min_comienzo_segmento = (substr($ca['Segment']['horario_desde'],0,2) * 60) + substr($ca['Segment']['horario_desde'],3,2);
				$min_fin_segmento      = (substr($ca['Segment']['horario_hasta'],0,2) * 60) + substr($ca['Segment']['horario_hasta'],3,2);

				$horario_comienzo  = 1400; // expresado en minutos, por ej. 480 son las 8 hs
				$horario_fin       = 0; // expresado en minutos
				$intervalo_horario = 60; // expresados en minutos

				// Defino el Intervalo minimo de Segmento
				if(!empty($ca['Segment']['duracion']) AND $ca['Segment']['duracion'] < $intervalo_horario){
					$intervalo_horario = $ca['Segment']['duracion'];
				}

				// Defino el Horario minimo del Día
				if($min_comienzo_segmento < $horario_comienzo){
					$horario_comienzo = $min_comienzo_segmento;
				}
				if($min_fin_segmento > $horario_fin){
					$horario_fin = $min_fin_segmento;
				}
				$cantidad_de_turnos = 0;
				for($i = $horario_comienzo; $i <= $horario_fin;$i=$i+$intervalo_horario) {
					$cantidad_de_turnos++;
				}
				
				$dia_actual = date("Y-m-d",mktime(0,0,0,$mes_inicio,$dia_inicio+($dia_de_la_semana-1),$ano_inicio));
				
				$Segmento['agenda_id']       = $ca['Segment']['id'];
				$Segmento['dia']             = $dia_actual;
				$Segmento['dia_desde']       = $dia_actual.' '.$ca['Segment']['horario_desde'].':00';;
				$Segmento['dia_hasta']       = $dia_actual.' '.$ca['Segment']['horario_hasta'].':00';;
				$Segmento['horario_desde']   = $ca['Segment']['horario_desde'];
				$Segmento['horario_hasta']   = $ca['Segment']['horario_hasta'];
				$Segmento['duracion']        = $ca['Segment']['duracion'];
				$Segmento['sexo']            = $ca['Segment']['sexo'];
				$Segmento['edad_desde']      = $ca['Segment']['edad_desde'];
				$Segmento['sobreturno']      = $ca['Segment']['sobreturno'];
				$Segmento['max_sobreturnos'] = $ca['Segment']['max_sobreturnos'];
				$Segmento['sobreturnos_publicos'] = $ca['Segment']['sobreturnos_publicos'];
				$Segmento['user_id']              = $ca['Agenda']['medico_id'];
				$Segmento['turnos_dados']         = 0;
				$Segmento['horario_comienzo']   = $horario_comienzo;
				$Segmento['horario_fin']        = $horario_fin;
				$Segmento['cantidad_turnos']    = $cantidad_de_turnos;
				$AgendaSemanal[$dia_de_la_semana][] = $Segmento;
			}
		}

//pr($AgendaSemanal); die();
		/* ----------------------------------------------------------------------------- */
		/* Consulto los Feriados para la Fecha Seleccionada								 */
		/* ----------------------------------------------------------------------------- */
		$feriados = $this->Agenda->query("
				SELECT 
					Feriado.name, Feriado.fecha
				FROM
					clients_feriados AS ClientsFeriado
					INNER JOIN feriados AS Feriado ON Feriado.id = ClientsFeriado.feriado_id
				WHERE 
					ClientsFeriado.client_id = '".$cliente_id."' AND 
					Feriado.fecha >= '".date("Y-m-d", mktime(0,0,0,$mes,$dia-7,$anio))."' AND 
					Feriado.fecha <= '".date("Y-m-d", mktime(0,0,0,$mes,$dia+7,$anio))."'
				ORDER BY 
					Feriado.fecha
			"
		);

		/* ----------------------------------------------------------------------------- */
		/* Consulto los Turnos dados en esa semana   									 */
		/* ----------------------------------------------------------------------------- */
		if($id_profesional>0){ $lista_medicos = $id_profesional;}
		$sql = "SELECT Person.id, Person.lastname, Person.name, Turn.fecha, Turn.id, Turn.nota, Turn.stateturn_id, Turn.doctor_id 
				FROM turns AS Turn 
					LEFT JOIN people AS Person ON (Turn.person_id = Person.id) 
				WHERE Turn.client_id = $cliente_id
					AND Turn.doctor_id IN ($lista_medicos) 
					AND Turn.stateturn_id != 3 
					AND Turn.staterecord_id = 1 
					AND Turn.fecha BETWEEN '$consulta_desde' AND '$consulta_hasta'   
				ORDER BY Turn.fecha ASC";
	
		$turnos = $this->Turn->query($sql);

//pr($turnos);
//pr($AgendaSemanal); die();
			//-------------------------------------------------------------------
			// Este bucle es para contar la cantidad de turnos dados por segmento
			//-------------------------------------------------------------------
			foreach($turnos as $registro) {

				$el_turno = strftime($registro['Turn']['fecha']);

				// Determino si alguna de las fechas a mostrar son anteriores a HOY y desactive los links
				if(strftime($el_turno) < strftime(date("Y-m-d"))){
					$data[$el_turno] = '<p></p>';
				} else {
					
					foreach($AgendaSemanal as $clave=>$valor){
						foreach($valor as $key=>$value){
							// Pertenece a este segmento ?
							if($el_turno>=strftime($value['dia_desde']) 
								AND $el_turno<=strftime($value['dia_hasta']) 
								AND $value['user_id']==$registro['Turn']['doctor_id'] ) {
								
								$AgendaSemanal[$clave][$key]['turnos_dados'] = $value['turnos_dados']+1;
								$AgendaSemanal[$clave][$key]['turnos'][$registro['Turn']['fecha']] = 'ocupado';
							}
						}
					}
/*				
					if(!isset($data[$registro['Turn']['fecha']])){
						$data[$registro['Turn']['fecha']] = 'ok';
					}
*/				
				}
			}
//pr($AgendaSemanal); die();

			//-------------------------------------------------------------------
			// Calculo por segmento para determinar si puedo otorgar sobreturnos
			//-------------------------------------------------------------------
			foreach($AgendaSemanal as $clave=>$valor){
				// Por el dia 1:Lunes, 2:Martes, etc
	
				foreach($valor as $key=>$value){
					// Por el Segmento de cada dia

					if($value['dia_hasta']< date("Y-m-d H:i:s") ) {
						unset($AgendaSemanal[$clave][$key]);
					} else {

						//------------------------ Valor por defecto, no puede dar sobreturnos
						$AgendaSemanal[$clave][$key]['ortoga_sobreturnos'] = 'N';
						
						if( $value['turnos_dados'] >= $value['cantidad_turnos'] ){
							//-- Ya dio todos los turnos normales, puede dar sobreturnos?

							if($value['sobreturno'] == 'S' ){
								// Segun la configuracion del segmento, pueda dar sobreturnos
								if( ($value['cantidad_turnos'] + $value['max_sobreturnos']) >= $value['turnos_dados']){
									//--- Aun le quedan sobreturnos para dar en ese segmento
									$AgendaSemanal[$clave][$key]['ortoga_sobreturnos'] = 'S';
								}
							}
						}
					}
				}	
			}
//pr($AgendaSemanal);
			//------------------------------------------------------------
			//              Elimino los días vacios (sin agenda)
			//------------------------------------------------------------
			foreach($AgendaSemanal as $clave=>$valor){
				if( empty($valor)) { unset($AgendaSemanal[$clave]); }
			}
			if (empty($AgendaSemanal) ) {
				
				return 'avanza';
			
			} else {
				
				//-------------------------------------------------------------
				// Armo la estructura de Turnos Disponibles
				//-------------------------------------------------------------
				foreach($AgendaSemanal as $clave=>$valor){
					foreach($valor as $key=>$value){
						$desde = $value['dia_desde'];
						$hasta = $value['dia_hasta'];
						$nuevo_turno = $desde;
						while($nuevo_turno <= $hasta){
							if($nuevo_turno > date("Y-m-d H:i:s") ) {
								if(!isset($value['turnos'][$nuevo_turno][$value['user_id']]) or $value['ortoga_sobreturnos']=='S' ){
									$Agenda[$nuevo_turno][$value['user_id']] = 'disponible';
								}
							}	
							$nuevafecha = strtotime ( "+{$value['duracion']} minute" , strtotime ( $nuevo_turno ) ) ;
							$nuevo_turno = date("Y-m-d H:i:s",$nuevafecha);
						}
					}
				}
			
				return $Agenda;
			
			}

		
        
	}
    


}
?>